import * as SignalTracker from '../misc/signalTracker.js';
import {adjustAnimationTime} from '../misc/animationUtils.js';
+import {logErrorUnlessCancelled} from '../misc/errorUtils.js';
const sessionSignalHolder = new SignalTracker.TransientSignalHolder();
const onStopped = params.onStopped;
delete params.onStopped;
- return isFinished => {
+ const {promise, resolve, reject} = Promise.withResolvers();
+ const callback = isFinished => {
cleanup?.();
if (onStopped)
onStopped(isFinished);
if (onComplete && isFinished)
onComplete();
+
+ if (isFinished) {
+ resolve();
+ } else {
+ reject(new GLib.Error(Gio.IOErrorEnum,
+ Gio.IOErrorEnum.CANCELLED, 'Transition was stopped before completing'));
+ }
};
+
+ return {promise, callback};
}
function _makeEasePrepareAndCleanup(duration) {
const easingDuration = actor.get_easing_duration();
const {prepare, cleanup} = _makeEasePrepareAndCleanup(easingDuration);
- const callback = _makeEaseCallback(params, cleanup);
+ const {promise, callback} = _makeEaseCallback(params, cleanup);
// cancel overwritten transitions
const animatedProps = Object.keys(params).map(p => p.replace('_', '-', 'g'));
} else {
callback(true);
}
+
+ return promise;
}
function _easeAnimatableProperty(animatable, propName, target, params) {
duration = 0;
const {prepare, cleanup} = _makeEasePrepareAndCleanup(duration);
- const callback = _makeEaseCallback(params, cleanup);
+ const {promise, callback} = _makeEaseCallback(params, cleanup);
// cancel overwritten transition
animatable.remove_transition(propName);
prepare?.();
callback(true);
- return;
+ return promise;
}
const pspec = animatable.find_property(propName);
transition.connectObject('stopped',
(t, finished) => callback(finished), sessionSignalHolder);
+ return promise;
}
// Add some bindings to the global JS namespace
};
Clutter.Actor.prototype.ease = function (props) {
- _easeActor(this, props);
+ _easeActor(this, props).catch(logErrorUnlessCancelled);
};
Clutter.Actor.prototype.ease_property = function (propName, target, params) {
- _easeAnimatableProperty(this, propName, target, params);
+ _easeAnimatableProperty(this, propName, target, params).catch(logErrorUnlessCancelled);
};
St.Adjustment.prototype.ease = function (target, params) {
// we're not an actor of course, but we implement the same
// transition API as Clutter.Actor, so this works anyway
- _easeAnimatableProperty(this, 'value', target, params);
+ _easeAnimatableProperty(this, 'value', target, params).catch(logErrorUnlessCancelled);
+};
+
+Clutter.Actor.prototype.easeAsync = async function (props) {
+ await _easeActor(this, props);
+};
+Clutter.Actor.prototype.ease_property_async = async function (propName, target, params) {
+ await _easeAnimatableProperty(this, propName, target, params);
+};
+St.Adjustment.prototype.easeAsync = async function (target, params) {
+ // we're not an actor of course, but we implement the same
+ // transition API as Clutter.Actor, so this works anyway
+ await _easeAnimatableProperty(this, 'value', target, params).catch(() => {});
};
Clutter.Actor.prototype[Symbol.iterator] = function* () {